/**
 * 
 */
package org.i1510.spider.utils.cbj.worker;

import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

import org.i1510.common.utils.StringUtils;
import org.i1510.common.utils.sqliteJdbc.DbUtils;
import org.i1510.spider.bean.SysSpiderRuleBean;
import org.i1510.spider.utils.cbj.parser.ContentDescParser;
import org.i1510.spider.utils.spider.fetcher.PageFetcher;
import org.i1510.spider.utils.spider.handler.ContentHandler;
import org.i1510.spider.utils.spider.model.FetchedPage;
import org.i1510.spider.utils.spider.model.SpiderParams;
import org.i1510.spider.utils.spider.queue.SpiderRuleQueue;
/**
 * @author Administrator
 *
 */
public class SpiderDescRuleWorker implements Runnable{
	private static final Logger log = Logger.getLogger(SpiderDescRuleWorker.class.getName());
	private PageFetcher fetcher;
	private ContentHandler handler;
	private ContentDescParser parser;
	private int threadIndex;
	
	public SpiderDescRuleWorker(int threadIndex){
		this.threadIndex = threadIndex;
		this.fetcher = new PageFetcher();
		this.handler = new ContentHandler();
		this.parser = new ContentDescParser();
	}
	
	@Override
	public void run() {		
		
		// 当待抓取URL队列不为空时，执行爬取任务
		// 注： 当队列内容为空时，也不爬取任务已经结束了
		//     因为有可能是UrlQueue暂时空，其他worker线程还没有将新的URL放入队列
		//	        所以，这里可以做个等待时间，再进行抓取（二次机会）
		while(!SpiderRuleQueue.isEmpty()){
			// 从待抓取队列中拿URL
			SysSpiderRuleBean sysSpiderRuleBean = SpiderRuleQueue.outElement();
			//如果不是该爬虫需要爬取的数据放回队列中
//			if(!sysSpiderRuleBean.getKey().equals("job_caibaojian")){
//				SpiderRuleQueue.addElement(sysSpiderRuleBean);
//				continue;
//			}
			String url = sysSpiderRuleBean.getUrl();
			if(!StringUtils.isStringEmpty(url)){
				// 抓取URL指定的页面，并返回状态码和页面内容构成的FetchedPage对象
				FetchedPage fetchedPage = fetcher.getContentFromUrl(url);
				
				// 检查爬取页面的合法性，爬虫是否被禁止
				if(!handler.check(fetchedPage)){
					// 切换IP等操作
					// TODO
					
					log.info("Spider-" + threadIndex + ": switch IP to ");
					continue;
				}
				
				// 解析页面，获取目标数据
				List<Map> list = parser.parse(fetchedPage,sysSpiderRuleBean);
				Map map = list.get(0);
				String sql = "";
				// 存储目标数据到数据存储（如DB）、存储已爬取的Url到VisitedUrlQueue
					sql = "insert into job_caibaojian_dt values(?,?,?,?,?,?);";
					Object[] o = new Object[6];
					o[0] = sysSpiderRuleBean.getValue();
					o[1] = sysSpiderRuleBean.getUrl();
					o[2] = sysSpiderRuleBean.getKey();
					o[3] = "";
					o[4] = map.get("descs");
					o[5] = map.get("title");

				DbUtils db = new DbUtils();
				System.out.println("执行采集sql-insert-dt："+sql);
				db.executeUpdate(sql, o);
				
				DbUtils dbx = new DbUtils();
				sql = "update  job_caibaojian set isFlag = 'X' where title = ? and href = ? and tag = ?";
				Object[] ox = new Object[3];
				ox[0] = sysSpiderRuleBean.getValue();
				ox[1] = sysSpiderRuleBean.getUrl();
				ox[2] = sysSpiderRuleBean.getKey();
				System.out.println("执行采集sql-update："+sql);
				dbx.executeUpdate(sql, ox);
				// delay
				try {
					Thread.sleep(SpiderParams.DEYLAY_TIME);
				} 
				catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
		}
		
		fetcher.close();
		log.info("Spider-" + threadIndex + ": stop...");
	}

}
